#include "app_485_protocol.h"
// 
#include <string.h>
#include <stdio.h>
// app
#include "common_param.h"
// lib
#include "crcLib.h"
#include "bytelib.h"
#include "debug.h"

//数据缓冲区
uint8_t buffer[PROTOCOL_BUFFER_LEN];

//命令列表
const command_module command_485_list[] =
{
    {0x0000 , Cmd_Analyse_State},       // V853状态更新
    {0x0001 , Cmd_Analyse_Battery},     // 读取电池电压
    {0x0002 , Cmd_Analyse_Alarm},       // 设置闹钟时间
};

// 计算当前可解析命令数量
#define COMMAND_NUMBER  (sizeof(command_485_list)/sizeof(command_485_list[0]))

//协议分析
void Protocol_Analysis(void)
{
		/*
    uint16_t datalen = Msp_V853_Uart_Read(buffer);                  //从串口缓冲区读取数据
    if(datalen == 0) return;                                        //如果没有可用的串口数据则返回
    //数据包检查
    _DEBUG_PRINTF(DBG_SYS, "read sothing data %d\r\n", datalen);
    uint8_t *addr = buffer + 2 ;                                    //设备地址
    if (*addr != PROTOCOL_ADDR) return;                             //设备不匹配则返回
    uint16_t *head = buffer;                                        //协议头
    uint16_t *cmd = buffer + 3;                                     //命令码
    uint16_t *len = buffer + 5;                                     //数据段长度
    uint8_t *data = buffer + 7;                                     //数据段
    uint16_t *crc = data + Ruint16(len);                            //计算CRC段
    uint16_t crc_de = crc16_modbus(buffer, 7 + Ruint16(len));
    if((Ruint16(head)!=0xA55A)||(Ruint16(crc)!=crc_de)) return;     //帧头和CRC不匹配则返回
    //匹配命令码
    int8_t cmd_index = -1;
    for(uint8_t i=0; i<COMMAND_NUMBER; i++)                         //遍历命令列表，寻找解析函数
    {
        if(Ruint16(cmd) != command_485_list[i].head) continue;          //命令不匹配，检查下一条
        else{cmd_index = i; break;}                                 //命令匹配，记录目录，离开遍历循环
    }
    if(cmd_index < 0) return;                                       //没有找到匹配的命令则返回
    else Wuint16(len, command_485_list[cmd_index].analyse(data, Ruint16(len))); //调用解析函数并记录响应数据长度
    crc = data + Ruint16(len);
    Wuint16(crc, crc16_modbus(buffer, 7 + Ruint16(len)));           //重新计算CRC
    Msp_V853_Uart_Write(buffer, 9+Ruint16(len));                    //发送响应数据到串口
		*/
}

uint16_t Cmd_Analyse_State(uint8_t *pdata, uint16_t len)
{
    // device_param.v853_state = *((uint8_t *)pdata + 0);              //记录V853主机的工作状态
    // *pdata = 0x00 ;                                                 //返回成功
    // _DEBUG_PRINTF(DBG_SYS, "get v583 state %d\r\n", device_param.v853_state);
    return 1;                                                       //返回响应包数据段长度
}

uint16_t Cmd_Analyse_Battery(uint8_t *pdata, uint16_t len)
{
    // uint16_t *battery = pdata;                                      //相应包数据段增加电池电压段
    // Wuint16(battery, device_param.power_voltage);                   //写数据到指定地址
    // return sizeof(*battery);                                        //返回响应包数据段长度
	  return 1;
}

uint16_t Cmd_Analyse_Alarm(uint8_t *pdata, uint16_t len)
{
    // memcpy(device_param.alarm_data, pdata, 6);                      //时间数据拷贝到参数
    // *pdata = 0x00 ;                                                 //返回成功
    // _DEBUG_PRINTF(DBG_SYS, "set time %d %d %d\r\n", device_param.alarm_data[3], device_param.alarm_data[4], device_param.alarm_data[5]);
    return 1;                                                       //返回响应包数据段长度
}
